{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "%reload_ext autoreload\n",
    "%autoreload 2\n",
    "\n",
    "from geometry import Cuboid, Rectangle\n",
    "from model import Data\n",
    "from boundary import DirichletBC, NeumannBC\n",
    "from grad import PytorchPDE\n",
    "from plot import plot_2D \n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "from torch.autograd.functional import vjp, vhp, jacobian, hessian\n",
    "\n",
    "device = torch.device(\"cuda:0\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def boundary_t(x, on_boundary):\n",
    "        return on_boundary and np.isclose(x[0], 0)   \n",
    "def boundary_x(x, on_boundary):\n",
    "        return on_boundary and (np.isclose(x[1], -1) or np.isclose(x[1], 1))\n",
    "    \n",
    "def func_t(x):\n",
    "        return -1*torch.sin(np.pi*x[:,1])\n",
    "def func_x(x):\n",
    "        return x[:,0]*0\n",
    "\n",
    "geom = Rectangle([0, -1],[1, 1])\n",
    "bc_t = DirichletBC(geom, func_t, boundary_t)\n",
    "bc_x = DirichletBC(geom, func_x, boundary_x)\n",
    "data = Data(geom, [bc_t, bc_x], num_domain=10000, num_boundary=400, num_test=10000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Net(\n",
       "  (fc1): Linear(in_features=2, out_features=50, bias=True)\n",
       "  (fc2): Linear(in_features=50, out_features=50, bias=True)\n",
       "  (fc3): Linear(in_features=50, out_features=50, bias=True)\n",
       "  (fc4): Linear(in_features=50, out_features=50, bias=True)\n",
       "  (fc5): Linear(in_features=50, out_features=1, bias=True)\n",
       ")"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "class Net(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(Net, self).__init__()\n",
    "        self.fc1 = nn.Linear(2, 50)\n",
    "        self.fc2 = nn.Linear(50, 50)\n",
    "        self.fc3 = nn.Linear(50, 50)\n",
    "        self.fc4 = nn.Linear(50, 50)\n",
    "        self.fc5 = nn.Linear(50, 1)\n",
    "\n",
    "    # x represents our data\n",
    "    def forward(self, x):\n",
    "\n",
    "        x = self.fc1(x)\n",
    "        x = torch.tanh(x)\n",
    "        x = self.fc2(x)\n",
    "        x = torch.tanh(x)\n",
    "        x = self.fc3(x)\n",
    "        x = torch.tanh(x)\n",
    "        x = self.fc4(x)\n",
    "        x = torch.tanh(x)\n",
    "        output = self.fc5(x)\n",
    "        return output\n",
    "    \n",
    "my_nn = Net()\n",
    "my_nn.to(device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "i: 1000 ; test_loss:  tensor(0.1056, device='cuda:0', grad_fn=<AddBackward0>)\n",
      "i: 2000 ; test_loss:  tensor(0.0712, device='cuda:0', grad_fn=<AddBackward0>)\n",
      "i: 3000 ; test_loss:  tensor(0.0297, device='cuda:0', grad_fn=<AddBackward0>)\n",
      "i: 4000 ; test_loss:  tensor(0.0191, device='cuda:0', grad_fn=<AddBackward0>)\n",
      "i: 5000 ; test_loss:  tensor(0.0115, device='cuda:0', grad_fn=<AddBackward0>)\n",
      "Finished Training\n"
     ]
    }
   ],
   "source": [
    "def pde(x,y,first_grads,second_grads):\n",
    "#     print(second_grads)\n",
    "    return first_grads[:,0] + y[:,0]*first_grads[:,1] - (0.01/np.pi)*second_grads[1][:,1]\n",
    "\n",
    "model = PytorchPDE(my_nn, data, pde, device)\n",
    "model.train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_2D(my_nn, data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random_data = torch.rand((10, 2))\n",
    "np.zeros((len(random_data), ))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([0.7161, 0.2519, 0.1380, 0.5146, 0.4031, 0.3028, 0.9641, 0.1102, 0.6714,\n",
       "        0.9609])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random_data[:,0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[0.7564, 0.2407],\n",
       "        [0.6065, 0.8533],\n",
       "        [0.0706, 0.7185],\n",
       "        [0.3801, 0.9559],\n",
       "        [0.6891, 0.2070],\n",
       "        [0.0740, 0.6403],\n",
       "        [0.7731, 0.4960],\n",
       "        [0.1614, 0.6728],\n",
       "        [0.1082, 0.6440],\n",
       "        [0.5258, 0.2824]])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[-0.2436, -0.7593],\n",
       "        [-0.3935, -0.1467],\n",
       "        [-0.9294, -0.2815],\n",
       "        [-0.6199, -0.0441],\n",
       "        [-0.3109, -0.7930],\n",
       "        [-0.9260, -0.3597],\n",
       "        [-0.2269, -0.5040],\n",
       "        [-0.8386, -0.3272],\n",
       "        [-0.8918, -0.3560],\n",
       "        [-0.4742, -0.7176]])"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random_data - 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
